<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 改变函数的this指向 
        // "use strict"
        // 一.call 函数改变this指向
        // fn.call(需要改变的this值,参数1,参数2,参数3...); 
        // function fn(x, y) {
        //     console.log(this, x, y);
        // }

        // fn(1,2); // 普通的调用 
        // 可以传递 对象 到函数里修改this
        // fn.call({name:"hello"},10,20);

        // 如果传 null 和  undefined 那么函数内部this 会指向 window
        // fn.call(undefined,1,2);

        // 如果传字符串 和数字 类型this 会执行 字符串和数字的包装对象；
        // var str = "hello";
        // console.log(Object( str));
        // var num = 123;
        // console.log(Object(num));
        // fn.call(1111,1,2);


        // 二、包装对象  ： string  number  boolean  symbol  bigInt
        // 不是包装对象 ： null undefined
    //     var str = "hello";

    //     function mysplit(str, arg) {  // 系统会自动处理
    //         // 1.把简单数据类型 包装成一个对象；
    //         var strObj = new String(str);
    //         console.log(strObj);
    //         // 2.调用这个包装对象的方法
    //         var res = strObj.split(arg);
    //         //    3.销毁这个包装对象
    //         // 4.返还包装对象的执行结果 
    //         return res;
    //     }
    //    var res =  mysplit(str, "");
    //    console.log(res);


        // console.dir(str);
        // var arr = str.split("");
        // console.log(arr);


        //三、 实现一个mycall方法 ；

        function fn(x, y) {
            console.log("??",this, x, y);
        }

      
        var obj = {name:"hello"};

        // fn.apply(obj,[1,2])

        // obj.fn();
        // fn();

        // Function.prototype.mycall = function(arg,...args){
        //     // console.log(this);
        //     // this;  //  fn函数  
        //     arg.myfn = this;  // 把 fn 函数 方法 arg对象上面  ---> arg = {name:"hello",myfn:function(x,y){}}
        //     var res = arg.myfn(...args);  // 执行了 fn函数 ，通过对象.fn() 执行的 那么 fn里的this 就会执行 arg这个对象 ；
        //     // 删除对象里的 myfn 方法 
        //     delete arg.myfn;
        //     return res;
        // }

        // fn.mycall(obj,10,20);

        
    </script>
</body>

</html>